
//2134.最小交换次数来组合所有的1 II
class Solution {
    public:
        int minSwaps(vector<int>& nums) {
            //此题要求将数组中1都聚集起来，也就是说有一部分区域内都是1
            //这也就使得只需要保持该区域中0的个数最小即可，这一个区域大小不难看出就是1的总个数
            int n=nums.size(),one=0;
            for(auto e:nums)
            if(e==1) one++;    //统计数组中1的个数
    
            int left=0,right=0;
            int ret=INT_MAX,tmp=0;
            while(right<n+one)  //right<n+one来处理泛型数组的要求
            {
                //入窗口
                while(right-left<one)
                    if(nums[(right++)%n]==0) tmp++;
       
                //更新答案
                ret=min(ret,tmp);
    
                //出窗口
                if(nums[(left++)%n]==0) tmp--;
            }
            return ret;
        }
    };